import Vue from "vue";
import store from "../../store/index";
import api from "../../config/apiConfig";


let wsCoinfig = {
  ws: null, //建立的连接
  lockReconnect: false, //是否真正建立连接
  timeout: 30 * 1000, //30秒一次心跳
  timeoutObj: null, //心跳心跳倒计时
  serverTimeoutObj: null, //心跳倒计时
  timeoutnum: null, //断开 重连倒计时

  userNo: (new Date().getTime().toString() + Math.floor(Math.random() * 100).toString())
}

// 初始化方法
initWebpack();

function initWebpack() {
  wsCoinfig.ws = new WebSocket(`${api.socketUrl}${wsCoinfig.userNo}`);
  wsCoinfig.ws.onopen = onopen;
  wsCoinfig.ws.onmessage = onmessage;
  wsCoinfig.ws.onclose = onclose;
  wsCoinfig.ws.onerror = onerror;
}

function reconnect() { //重新连接
  if (wsCoinfig.lockReconnect) {
    return;
  };
  wsCoinfig.lockReconnect = true;
  //没连接上会一直重连，设置延迟避免请求过多
  wsCoinfig.timeoutnum && clearTimeout(wsCoinfig.timeoutnum);
  wsCoinfig.timeoutnum = setTimeout(function() {
    //新连接
    initWebpack();
    wsCoinfig.lockReconnect = false;
  }, 5000);
};

function reset() { //重置心跳
  clearTimeout(wsCoinfig.timeoutObj);
  clearTimeout(wsCoinfig.serverTimeoutObj);
  //重启心跳
  start();
};

function start() { //开启心跳
  // console.log('开启心跳');
  wsCoinfig.timeoutObj && clearTimeout(wsCoinfig.timeoutObj);
  wsCoinfig.serverTimeoutObj && clearTimeout(wsCoinfig.serverTimeoutObj);
  wsCoinfig.timeoutObj = setTimeout(() => {
    //这里发送一个心跳，后端收到后，返回一个心跳消息，
    if (wsCoinfig.ws.readyState == 1) { //如果连接正常
      wsCoinfig.ws.send("ping");
    } else { //否则重连
      reconnect();
    }

    //心跳时间内没有重新开启心跳就关闭 socket
    wsCoinfig.serverTimeoutObj = setTimeout(() => {
      //超时关闭
      console.log('超时关闭');
      wsCoinfig.ws.close();
    }, wsCoinfig.timeout);

  }, wsCoinfig.timeout)
};

function onopen() {
  console.log("open");
  //开启心跳
  start();

  //连接成功后 发送 获取币种信息的请求  先判断缓存有没有币种 没有就不发送
  // let coinData = JSON.parse(sessionStorage.getItem('selectedCoin'))
  // if (coinData&&coinData.tradcoin) {
  //   wsCoinfig.ws.send(`${coinData.maincoin}_${coinData.tradcoin}`)
  // }else{
  //   wsCoinfig.ws.send(`USDT_BTC`)
  // }
};

function onmessage(e) {
  if (e) {
    //收到服务端的心跳回应 重置心跳
    if (e.data == 'pong') {
      reset();
      return;
    }
    let resData = JSON.parse(e.data);
    //处理行情数据
    if (resData.symbols) {
      resData.time = new Date().getTime();
      // 更新数据  行情
      store.commit("updateMarketSocketData", resData);
    }
    if (resData.info) {
      resData.time = new Date().getTime();
      // 更新数据  币种数据
      store.commit("updateCoinSocketData", resData);
    }
    //收到服务器信息，心跳重置
  }
};

function onclose(e) {
  console.log(e);
  console.log("连接关闭");
  //重连
  reconnect();
}

function onerror(e) {
  console.log("出现错误");
  //重连
  reconnect();
}



Vue.prototype.$ws = wsCoinfig.ws;